package org.ricks.log.message;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

/**
 * @author chenwei
 * @Description:
 * @date 2023/1/916:13
 */
class MessageHelper {
    /**
     * 拼接时是单线程，这个不会被并发
     */
    private static final SimpleDateFormat DEFAULT_PATTERN = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

    private MessageHelper() {
    }

    /**
     * 预处理对象到字符串.
     * <p>
     * 进入日志线程前对一些有并发风险的对象进行提前处理.
     *
     * @param object 参数对象
     * @return 对象的ToString结果
     */
    static Object preprocessingEnteringLogThreadBefore(Object object) {
        if (object == null) {
            return object;
        }

        // 基本数据类型
        else if (object instanceof Number || object instanceof Date || object instanceof Character) {
            return object;
        }

        // 异常堆栈 或 标识线程安全
        else if (object instanceof Throwable ) {
            return object;
        }

        // 数组类型的输出...
        else if (object.getClass().isArray()) {
            if (object instanceof byte[]) {
                return (Arrays.toString((byte[]) object));
            } else if (object instanceof short[]) {
                return (Arrays.toString((short[]) object));
            } else if (object instanceof int[]) {
                return (Arrays.toString((int[]) object));
            } else if (object instanceof long[]) {
                return (Arrays.toString((long[]) object));
            } else if (object instanceof float[]) {
                return (Arrays.toString((float[]) object));
            } else if (object instanceof double[]) {
                return (Arrays.toString((double[]) object));
            } else if (object instanceof String[]) {
                return (Arrays.toString((String[]) object));
            } else {
                return (Arrays.toString((Object[]) object));
            }
        }

        // 不是基本数据类型且没有线程安全标识需要提前转化为String文本
        else {
            return object.toString();
        }
    }

    /**
     * 日志线程进行参数拼接工作.
     *
     * @param sb     拼接结果对象
     * @param object 参数对象
     */
    static void append(StringBuilder sb, Object object) {
        if (object == null) {
            sb.append(object);
        }
        // 异常类型的输出...
        else if (object instanceof Throwable) {
            try (StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw)) {
                ((Throwable) object).printStackTrace(pw);
                sb.append("\n").append(sw.toString());
            } catch (Exception e) {
                sb.append(object);
            }
        }
        // 时间类型的，需要格式化一下
        else if (object instanceof Date) {
            sb.append(DEFAULT_PATTERN.format(object));
        }
        // 默认的交给StringBuilder
        else {
            sb.append(object);
        }
    }
}
